package com.example.redisson.redisson.message;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;

@Component
public class MessageSubscriber {

    @Resource
    private RedissonClient redissonClient;

    // 订阅消息，这个组件被 IOC 容器创建后，会自动调用 @PostConstruct 标记的方法，即 subscribe() 方法，添加一个监听器
    @PostConstruct
    public void subscribe() {
        // 获取一个发布/订阅对象，如果不存在则创建
        RTopic topic = redissonClient.getTopic("myTopic");

        // 添加一个监听器
        topic.addListener(String.class, (channel, message) -> {
            // 处理接收到的消息
            System.out.println("Received message: " + message);
        });
    }


    // @PostConstruct 是一个 Java 标准注解，用于标记一个非私有的 void 方法，该方法在依赖注入完成后由容器调用。
    // @PostConstruct 标记的方法必须是非私有的 void 方法。它不能带有任何参数，也不能抛出任何异常。
    // @PostConstruct 注解用于标记需要在依赖注入完成后执行的初始化方法。它可以用来执行必要的初始化逻辑，如创建连接、设置默认值等。
    // @PostConstruct 注解可以用来配置 Redis 消息监听。由于 @PostConstruct 方法会在依赖注入完成后由容器调用，因此它可以用于初始化监听器并启动监听过程。
    // @PostConstruct 标记的方法会在每个被管理的 bean 的实例上执行一次。这有助于确保初始化逻辑只被执行一次，避免多次初始化导致的问题
}
